﻿/*
 * 	Easy Slider 1.5 - jQuery plugin
 *	written by Alen Grakalic	
 *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 *
 *	Built for jQuery library
 *	http://jquery.com
 *
 */
 
/*
 *	markup example for $("#slider").easySlider();
 *	
 * 	<div id="slider">
 *		<ul>
 *			<li><img src="images/01.jpg" alt="" /></li>
 *			<li><img src="images/02.jpg" alt="" /></li>
 *			<li><img src="images/03.jpg" alt="" /></li>
 *			<li><img src="images/04.jpg" alt="" /></li>
 *			<li><img src="images/05.jpg" alt="" /></li>
 *		</ul>
 *	</div>
 *
 */

(function($) {

	$.fn.easySlider = function(options) {

		// default configuration properties
		var defaults = {
			textControlsShow: false,
			prevId: 'prevBtn',
			prevText: 'Previous',
			nextId: 'nextBtn',
			nextText: 'Next',
			controlsBefore: '',
			controlsAfter: '',
			controlsFade: false,
			firstId: 'firstBtn',
			firstText: 'First',
			firstShow: true,
			lastId: 'lastBtn',
			lastText: 'Last',
			lastShow: true,

			numberControlsShow: true,
			vertical: false,
			speed: 800,
			auto: true,
			pause: 2000,
			continuous: true
		};

		var options = $.extend(defaults, options);

		this.each(function() {
			var obj = $(this);
			var s = $("li", obj).length;
			var w = $("li", obj).width();
			var h = $("li", obj).height();
			obj.width(w);
			//obj.height(h);
			obj.css("overflow", "hidden");
			var ts = s - 1;
			var t = 0;
			$("ul", obj).css('width', s * w);
			if (!options.vertical) $("li", obj).css('float', 'left');

			if (options.textControlsShow) {
				var html = options.controlsBefore;
				if (options.firstShow)
					html += '<span id="' + options.firstId + '"><a href=\"javascript:void(0);\">' + options.firstText + '</a></span>';
				html += ' <span id="' + options.prevId + '"><a href=\"javascript:void(0);\">' + options.prevText + '</a></span>';
				html += ' <span id="' + options.nextId + '"><a href=\"javascript:void(0);\">' + options.nextText + '</a></span>';
				if (options.lastShow)
					html += ' <span id="' + options.lastId + '"><a href=\"javascript:void(0);\">' + options.lastText + '</a></span>';
				html += options.controlsAfter;
				$(obj).after(html);

				$("a", "#" + options.nextId).click(function() {
					controlsShowAnimate("next", true);
				});
				$("a", "#" + options.prevId).click(function() {
					controlsShowAnimate("prev", true);
				});
				$("a", "#" + options.firstId).click(function() {
					controlsShowAnimate("first", true);
				});
				$("a", "#" + options.lastId).click(function() {
					controlsShowAnimate("last", true);
				});

			} else if (options.numberControlsShow) {
				var html = options.controlsBefore;
				html += '<div id="numberControls">';
				for (var i = 1; i <= s; i++) {
					html += '<a href="javascript:void(0);" class="numberTip">' + i + '</a>';
				}
				html += '<span style="clear:both;">&nbsp;</span></div>';
				html += options.controlsAfter;
				$(obj).append(html);

				$("a", "#numberControls").each(function(index, domEle) {
					$(domEle).mouseover(function() {
						numberShowAnimate(index, true);
					});
				});

				$("a:first", "#numberControls").css({ "backgroundColor": "#2277DD", "color": "white" });
			}

			if (options.auto) {
				$("li", obj).hover
				(
					function() {
						if (timeout) clearTimeout(timeout);
					},
					function() {
						if (options.numberControlsShow) {
							timeout = setTimeout(function() {
								numberShowAnimate((t >= ts ? (options.continuous ? 0 : ts) : t + 1), false);
							}, options.pause);
						} else {
							timeout = setTimeout(function() {
								controlsShowAnimate("next", false);
							}, options.pause);
						}
					}
				);


				if (options.numberControlsShow) {
					$("a", "#numberControls").hover
					(
						function() {
							if (timeout) clearTimeout(timeout);
						},
						function() {
							if (options.numberControlsShow) {
								timeout = setTimeout(function() {
									numberShowAnimate((t >= ts ? (options.continuous ? 0 : ts) : t + 1), false);
								}, options.pause);
							} else {
								timeout = setTimeout(function() {
									controlsShowAnimate("next", false);
								}, options.pause);
							}
						}
					);
				}

			}

			// init
			var timeout;
			if (options.auto) {
				;
				if (options.numberControlsShow) {
					timeout = setTimeout(function() {
						numberShowAnimate(1, false);
					}, options.pause);
				} else {
					timeout = setTimeout(function() {
						controlsShowAnimate("next", false);
					}, options.pause);
				}
			};

			if (options.textControlsShow) {
				if (!options.continuous && options.controlsFade) {
					$("a", "#" + options.prevId).hide();
					$("a", "#" + options.firstId).hide();
				};
			}

			function controlsShowAnimate(dir, clicked) {
				var ot = t;
				if (options.textControlsShow || options.auto) {
					switch (dir) {
						case "next":
							t = (ot >= ts) ? (options.continuous ? 0 : ts) : t + 1;
							break;
						case "prev":
							t = (t <= 0) ? (options.continuous ? ts : 0) : t - 1;
							break;
						case "first":
							t = 0;
							break;
						case "last":
							t = ts;
							break;
						default:
							break;
					};
					if (!options.continuous && options.controlsFade) {
						if (t == ts) {
							$("a", "#" + options.nextId).hide();
							$("a", "#" + options.lastId).hide();
						} else {
							$("a", "#" + options.nextId).show();
							$("a", "#" + options.lastId).show();
						};
						if (t == 0) {
							$("a", "#" + options.prevId).hide();
							$("a", "#" + options.firstId).hide();
						} else {
							$("a", "#" + options.prevId).show();
							$("a", "#" + options.firstId).show();
						};
					}
				}

				var diff = Math.abs(ot - t);
				var speed = diff * options.speed;
				move(t, speed);

				if (options.auto && !clicked) {
					timeout = setTimeout(function() {
						controlsShowAnimate("next", false);
					}, diff * options.speed + options.pause);
				}
			};


			function numberShowAnimate(num, clicked) {
				var ot = t;
				t = num;

				var diff = Math.abs(ot - t);
				var speed = diff * options.speed;
				move(t, speed);

				if (options.numberControlsShow || options.auto) {
					$("a", "#numberControls").css({ "backgroundColor": "", "color": "" });
					$($("a", "#numberControls")[t]).css({ "backgroundColor": "#2277DD", "color": "white" });
				}

				if (options.auto && !clicked) {
					timeout = setTimeout(function() {
						numberShowAnimate(((num >= ts) ? (options.continuous ? 0 : ts) : num + 1), false);
					}, diff * options.speed + options.pause);

				}
			};

			function move(t, speed) {
				if (!options.vertical) {
					p = (t * w * -1);
					$("ul", obj).animate(
						{ marginLeft: p },
						speed
					);
				} else {
					p = (t * h * -1);
					$("ul", obj).animate(
						{ marginTop: p },
						speed
					);
				};
			}
		});

	};
})(jQuery);